为了将web-app放入一个OAuth2客户端,你只需注解@EnableOAuth2Client
,Spring Boot会创建OAuth2ClientContext
和OAuth2ProtectedResourceDetails
,这些是创建OAuth2RestOperations
必需的。Spring Boot不会自动创建该bean,但你自己创建也不费力:
@Bean
public OAuth2RestTemplate oauth2RestTemplate(OAuth2ClientContext oauth2ClientContext,
OAuth2ProtectedResourceDetails details) {
return new OAuth2RestTemplate(details, oauth2ClientContext);
}
注 你可能想添加一个限定名(qualifier),因为应用中可能定义多个RestTemplate
。
该配置使用security.oauth2.client.*
作为证书(跟授权服务器使用的相同),此外,它也需要知道授权服务器中认证和token的URIs,例如:
security:
oauth2:
client:
clientId: bd1c0a783ccdd1c9b9e4
clientSecret: 1a9030fbca47a5b2c28e92f19050bb77824b5ad1
accessTokenUri: https://github.com/login/oauth/access_token
userAuthorizationUri: https://github.com/login/oauth/authorize
clientAuthenticationScheme: form
具有该配置的应用在使用OAuth2RestTemplate
时会重定向到GitHub以完成授权,如果已经登陆GitHub,你甚至不会注意到它已经授权过了。那些特殊的凭证(credentials)只在应用运行于8080端口时有效(为了更灵活,在GitHub或其他提供商上注册自己的客户端app)。
在客户端获取access token时,你可以设置security.oauth2.client.scope
(逗号分隔或一个YAML数组)来限制它请求的作用域(scope)。作用域默认是空的,默认值取决于授权服务器,通常依赖于它拥有的客户端在注册时的设置。
注 对security.oauth2.client.client-authentication-scheme
也有设置,默认为"header"(如果你的OAuth2提供商不喜欢header认证,例如Github,你可能需要将它设置为“form”)。实际上,security.oauth2.client.*
属性绑定到一个AuthorizationCodeResourceDetails
实例,所以它的所有属性都可以指定。
注 在一个非web应用中,你仍旧可以创建一个OAuth2RestOperations
,并且跟security.oauth2.client.*
配置关联。在这种情况下,它是一个“client credentials token grant”,如果你使用它的话就需要获取(此处不需要注解@EnableOAuth2Client
或@EnableOAuth2Sso
)。为了防止基础设施定义,只需要将security.oauth2.client.client-id
从配置中移除(或将它设为空字符串)。